package com.castle.fortress.admin.pay.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.castle.fortress.admin.pay.dto.PayWxConfigDto;
import com.castle.fortress.admin.pay.entity.PayWxConfigEntity;
import com.castle.fortress.admin.pay.mapper.PayWxConfigMapper;
import com.castle.fortress.admin.pay.service.PayWxConfigService;
import com.castle.fortress.common.enums.YesNoEnum;
import com.castle.fortress.common.utils.CommonUtil;
import com.castle.fortress.common.utils.ConvertUtil;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 微信支付配置表 服务实现类
 *
 * @author castle
 * @since 2022-07-07
 */
@Service
public class PayWxConfigServiceImpl extends ServiceImpl<PayWxConfigMapper, PayWxConfigEntity> implements PayWxConfigService {
    /**
    * 获取查询条件
    * @param payWxConfigDto
    * @return
    */
    public QueryWrapper<PayWxConfigEntity> getWrapper(PayWxConfigDto payWxConfigDto){
        QueryWrapper<PayWxConfigEntity> wrapper= new QueryWrapper();
        if(payWxConfigDto != null){
            PayWxConfigEntity payWxConfigEntity = ConvertUtil.transformObj(payWxConfigDto,PayWxConfigEntity.class);
            wrapper.like(payWxConfigEntity.getId() != null,"id",payWxConfigEntity.getId());
            wrapper.like(StrUtil.isNotEmpty(payWxConfigEntity.getAppId()),"app_id",payWxConfigEntity.getAppId());
            wrapper.like(StrUtil.isNotEmpty(payWxConfigEntity.getAppSecret()),"app_secret",payWxConfigEntity.getAppSecret());
            wrapper.like(StrUtil.isNotEmpty(payWxConfigEntity.getMchId()),"mch_id",payWxConfigEntity.getMchId());
            wrapper.like(StrUtil.isNotEmpty(payWxConfigEntity.getMchKey()),"mch_key",payWxConfigEntity.getMchKey());
            wrapper.like(StrUtil.isNotEmpty(payWxConfigEntity.getKeyPath()),"key_path",payWxConfigEntity.getKeyPath());
            wrapper.like(StrUtil.isNotEmpty(payWxConfigEntity.getNotifyUrl()),"notify_url",payWxConfigEntity.getNotifyUrl());
            wrapper.like(StrUtil.isNotEmpty(payWxConfigEntity.getReturnUrl()),"return_url",payWxConfigEntity.getReturnUrl());
            wrapper.like(StrUtil.isNotEmpty(payWxConfigEntity.getPayTypeCode()),"pay_type_code",payWxConfigEntity.getPayTypeCode());
            wrapper.eq(StrUtil.isNotEmpty(payWxConfigEntity.getSceneCode()),"scene_code",payWxConfigEntity.getSceneCode());
            wrapper.like(payWxConfigEntity.getStatus() != null,"status",payWxConfigEntity.getStatus());
        }
        return wrapper;
    }


    @Override
    public IPage<PayWxConfigDto> pagePayWxConfig(Page<PayWxConfigDto> page, PayWxConfigDto payWxConfigDto) {
        QueryWrapper<PayWxConfigEntity> wrapper = getWrapper(payWxConfigDto);
        Page<PayWxConfigEntity> pageEntity = new Page(page.getCurrent(), page.getSize());
        Page<PayWxConfigEntity> payWxConfigPage=baseMapper.selectPage(pageEntity,wrapper);
        Page<PayWxConfigDto> pageDto = new Page(payWxConfigPage.getCurrent(), payWxConfigPage.getSize(),payWxConfigPage.getTotal());
        pageDto.setRecords(ConvertUtil.transformObjList(payWxConfigPage.getRecords(),PayWxConfigDto.class));
        return pageDto;
    }


    @Override
    public List<PayWxConfigDto> listPayWxConfig(PayWxConfigDto payWxConfigDto){
        QueryWrapper<PayWxConfigEntity> wrapper = getWrapper(payWxConfigDto);
        List<PayWxConfigEntity> list = baseMapper.selectList(wrapper);
        return ConvertUtil.transformObjList(list,PayWxConfigDto.class);
    }

    @Override
    public PayWxConfigDto getPayConfig(String code, String sceneCode) {
        if(CommonUtil.verifyParamEmpty(code,sceneCode)){
            return null;
        }
        PayWxConfigDto payWxConfigDto = new PayWxConfigDto();
        payWxConfigDto.setPayTypeCode(code);
        payWxConfigDto.setSceneCode(sceneCode);
        payWxConfigDto.setStatus(YesNoEnum.YES.getCode());
        List<PayWxConfigDto> list = listPayWxConfig(payWxConfigDto);
        if(list==null || list.size()!= 1){
            return null;
        }
        return list.get(0);
    }

    @Override
    public void initStatus(PayWxConfigEntity entity) {
        Integer status = entity.getStatus()!=1?2:entity.getStatus();
        if(CommonUtil.verifyParamEmpty(entity,entity.getAppId(),entity.getMchId(),entity.getMchSerialNo(),entity.getApiV3Key(),entity.getNotifyUrl(),entity.getSceneCode(),entity.getPayTypeCode())){
            status = 3;
        }
        entity.setStatus(status);
    }
}

